# 生成器
"""
生成器：这种一边循环一边计算的机制，称为生成器：generator

生成器创建方式：
1、只要把一个列表生成式的[]改成()，就创建了一个generator:
L1=(x**2 for x in range(10))  #生成器

2、如果一个函数定义中包含yield关键字，那么这个函数就不再是一个普通函数，而是一个generator
变成generator的函数，在每次调用next()的时候执行，遇到yield语句返回，再次执行时从上次返回的yield语句处继续执行。

如何访问生成器中元素：next(生成器对象)、生成器对象.__next__()
"""

# 使用函数式生成器生成一个斐波拉契数列

def fib(max):
    n,a,b = 0,0,1
    while n < max:
        yield b
        a,b = b,a+b
        n = n + 1
    return 'ok'

# return 后接的内容即为超出生成器取值范围所提示的错误信息：StopIteration: ok

res = fib(8)
print(res)
for i in range(8):
    result = next(res)
    print(result)

# 定义生成器的另一种方式：将列表生成式的[]换成()
# 列表生成式
ls = [x if x%2==0 else x*3 for x in range(15)]
print(ls)
print(type(ls))

# 生成器
g = (x if x%2==0 else x*3 for x in range(15))
print(type(g))
print(g)
print(g.__next__())
print(next(g))